/**
 * 存储购物车商品列表数据
 */
export default {
  namespaced: true,
  // 1.定义变量
  state: {
    list: []
  },
  getters: {
    // 有效商品列表
    validList: state => {
      // 根据item.isEffective值：true 留下 | false 去掉
      return state.list.filter(item => item.isEffective)
    },
    // 有效商品选中的商品列表
    validSeledList (state, getters) {
      return getters.validList.filter(item => item.selected)
    },
    // 有效商品选中商品列表的总价
    validSeledListTotal (state, getters) {
      // 写法1：forEach实现
      // 1. 总价
      // let total = 0
      // getters.validSeledList.forEach(item => {
      //   // 2. 累加
      //   total += item.nowPrice * item.count
      // })
      // return total
      // 写法2：reduce实现
      return getters.validSeledList.reduce((total, item) =>
        total + item.nowPrice * item.count, 0)
    },
    // 有效商品是否是全部选中状态
    validListSeledAll (state, getters) {
      return getters.validList.every(item => item.selected)
    }

  },
  // state: () => ({
  //   list: []
  // }),
  // 2.修改变量
  mutations: {
    /**
     * 加入购物车
     * @param {*} state
     * @param {*} skuGood
     */
    addCart (state, skuGood) {
      /**
       * 判断之前是否加入过该商品（排重）
       * 1.加入过：数量的增加
       * 2.没有加入过：新增
       */
      const index = state.list.findIndex((item) => item.skuId === skuGood.skuId)
      if (index === -1) {
        // 不存在
        state.list.unshift(skuGood)
      } else {
        state.list[index].count += skuGood.count
      }
    },
    /**
     * 单选
     * @param {*} state
     * @param {*} {good：当前勾选商品, sel：当前商品勾选状态}
     */
    singleSel (state, { good, sel }) {
      /**
       * 1.在state.list中找到要修改的商品
       * 2.修改商品的选中
       */
      const currGood = state.list.find((item) => item.skuId === good.skuId)
      currGood.selected = sel
    },
    /**
     * 全选
     * @param {*} state
     * @param {*} isSelAll 全选框选中boolean状态
     */
    isSelAll (state, isSelAll) {
      /**
       * 全选和取消全选：
       * 如果全选框：
       * 1.选中true：列表全选中
       * 2.未选中false：列表全部取消选中
       */
      state.list.forEach(item => {
        // 每个商品的选中和全选框选中的值保持一样
        item.selected = isSelAll
      })
    }
  },
  // 3.发送请求（异步）
  actions: {
    /**
     *
     * @param {*} param0
     * @param {*} skuGood 当前加入购物车的sku组合商品
     * 购物车逻辑：
     * 1.未登录
     * 数据存到vuex
     *
     * 2.已登录
     * 数据存到数据库
     */
    addCartAction ({ commit, rootState }, skuGood) {
      if (rootState.user.profile.token) {
        // 已经登录
        console.log('已登录')
      } else {
        // 未登录
        console.log('未登录新增的sku商品信息：', skuGood)
        // 调用mutations方法加入购物车
        commit('addCart', skuGood)
        return '加入购物车成功'
      }
    },
    /**
     * 商品单选
     * @param {*} param0
     * @returns
     */
    singleSelAction ({ commit, rootState }, { good, sel }) {
      if (rootState.user.profile.token) {
        // 已经登录
        console.log('已登录')
      } else {
        // 未登录
        commit('singleSel', { good, sel })
      }
    },
    /**
     * 商品全选
     * @param {*} param0
     * @param {*} param1
     */
    selAllAction ({ commit, rootState }, isSelAll) {
      if (rootState.user.profile.token) {
        // 已经登录
        console.log('已登录')
      } else {
        // 未登录
        commit('isSelAll', isSelAll)
      }
    }
  }
}
